23859
3997
Esta questão já tem respostas aqui:
Nenhuma conversão implícita no operador sobrecarregado
(2 respostas)
Fechado há 7 anos.
Estou escrevendo um wrapper simples para um tipo elementar e estou tentando evitar ter que escrever muitos tipos de operadores padrão. Eu esperava que a conversão implícita de tipo ajudasse, mas não ajuda. Aqui está um exemplo simplificado:
struct Int
{
int _i;
Int (int i = 0): _i {i} {}
Operador Int + (const Int & rhs) {return _i + rhs._i;}
};
int main (int argc, char * argv [])
{
(vazio) (Int (1) + 2); // Multar
(vazio) (2 + Int (1)); // erro: operandos inválidos para expressão binária ('int' e 'Int')
}
Estou usando o llvm. A primeira linha de compilações principais está bem O segundo causa um erro. Agora, o que eu esperava que acontecesse na segunda linha é que 2 fosse convertido implicitamente em Int (2), seguido por uma chamada para o operador +. Por que isso não está acontecendo? Por que a conversão implícita está acontecendo na primeira linha? 
Isso acontece na primeira linha porque o único operador + disponível é o operador + (Int &) (que tem um primeiro parâmetro implícito de Int para esta instância). A segunda linha falha porque o primeiro parâmetro é um int e não faz ideia de que precisa convertê-lo antes de tentar a operação (não sabe que precisa usar Int :: operator +).
Você pode evitar esse problema tornando a operadora uma função de amigo não membro (http://ideone.com/YCf7wX)
struct Int
{
int _i;
Int (int i = 0): _i {i} {}
operador amigo Int + (const Int & lhs, const Int & rhs);
};
Operador Int + (const Int & lhs, const Int & rhs)
{
return lhs._i + rhs._i;
}
int main ()
{
Int i;
i + 5;
5 + i;
return 0;
}
|
Não é a resposta que você está procurando? Navegue por outras questões marcadas com conversão implícita de palavra-chave do operador c ++ ou faça sua própria pergunta.